package com.kookapi.business.service.impl;

import java.util.List;

import com.kookapi.business.constants.CustomParamKeyConstant;
import com.kookapi.common.utils.DateUtils;
import com.kookapi.common.utils.SecurityUtils;
import com.kookapi.system.service.ISysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.kookapi.business.mapper.ApiDefinitionMapper;
import com.kookapi.business.domain.ApiDefinition;
import com.kookapi.business.service.IApiDefinitionService;

/**
 * 接口定义管理Service业务层处理
 * 
 * @author cleftgou
 * @date 2025-10-05
 */
@Service
@Slf4j
public class ApiDefinitionServiceImpl implements IApiDefinitionService 
{
    @Autowired
    private ApiDefinitionMapper apiDefinitionMapper;

    @Autowired
    private ISysConfigService sysConfigService;

    /**
     * 查询接口定义管理
     * 
     * @param id 接口定义管理主键
     * @return 接口定义管理
     */
    @Override
    public ApiDefinition selectApiDefinitionById(Long id)
    {
        ApiDefinition apiDefinition = apiDefinitionMapper.selectApiDefinitionById(id);
        // 补一个逻辑，数据库里存的是业务接口地址，前缀需要在这里根据其情况补上（PS：修改时（单查）调用的这个业务）
        needAddPrefix(apiDefinition);
        return apiDefinition;
    }

    /**
     * 查询接口定义管理列表
     * 
     * @param apiDefinition 接口定义管理
     * @return 接口定义管理
     */
    @Override
    public List<ApiDefinition> selectApiDefinitionList(ApiDefinition apiDefinition)
    {
        List<ApiDefinition> apiDefinitions = apiDefinitionMapper.selectApiDefinitionList(apiDefinition);
        apiDefinitions.forEach(this::needAddPrefix);
        return apiDefinitions;
    }

    /**
     * 新增接口定义管理
     * 
     * @param apiDefinition 接口定义管理
     * @return 结果
     */
    @Override
    public int insertApiDefinition(ApiDefinition apiDefinition)
    {
        apiDefinition.setCreateTime(DateUtils.getNowDate());
        apiDefinition.setCreateBy(SecurityUtils.getUsername());
        return apiDefinitionMapper.insertApiDefinition(apiDefinition);
    }

    /**
     * 修改接口定义管理
     * 
     * @param apiDefinition 接口定义管理
     * @return 结果
     */
    @Override
    public int updateApiDefinition(ApiDefinition apiDefinition)
    {
        apiDefinition.setUpdateTime(DateUtils.getNowDate());
        apiDefinition.setUpdateBy(SecurityUtils.getUsername());
        return apiDefinitionMapper.updateApiDefinition(apiDefinition);
    }

    /**
     * 批量删除接口定义管理
     * 
     * @param ids 需要删除的接口定义管理主键
     * @return 结果
     */
    @Override
    public int deleteApiDefinitionByIds(Long[] ids)
    {
        return apiDefinitionMapper.deleteApiDefinitionByIds(ids);
    }

    /**
     * 删除接口定义管理信息
     * 
     * @param id 接口定义管理主键
     * @return 结果
     */
    @Override
    public int deleteApiDefinitionById(Long id)
    {
        return apiDefinitionMapper.deleteApiDefinitionById(id);
    }

    /**
     * 判断是否需要补充前缀
     */
    private void needAddPrefix(ApiDefinition apiDefinition) {
        // 若已是完整接口地址，则不需要补前缀（即非http开头）
        if (apiDefinition != null && !apiDefinition.getUrl().startsWith("http")) {
            // 若不是完整接口地址，则补一下环境前缀
            // 根据键名查询参数配置信息
            String baseurl = sysConfigService.selectConfigByKey(CustomParamKeyConstant.KOOKAPI_DEFINITION_BASEURL_KEY);
            apiDefinition.setUrl(baseurl + apiDefinition.getUrl());
            log.info("补前缀后的接口地址为：{}", apiDefinition.getUrl());
        }
    }
}
